﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.IO;

public partial class ProcesoSeleccion_FrAdmProcesosSeleccion : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        //-------------------------Lineas Agregadas para la seguridad----------------------------------------------------
        if (Session["nit"] != null)
            Response.Redirect("/SUEWebSite/Error.aspx");
        else if (Session["nomUsr"] != null)
        {
            
            List<String> Permisos = (List<String>)Session["Permisos"];
            if (!Permisos.Contains(System.IO.Path.GetFileName(HttpContext.Current.Request.FilePath)))
                Response.Redirect("/SUEWebSite/Error.aspx");
        }
        else Response.Redirect("/SUEWebSite/Principal.aspx");
        //-------------------------Lineas Agregadas para la seguridad----------------------------------------------------

        
        
        // Al cargar la página se cargan todos practicantes que tengan el estado activo
        // Al cargar la página se cargan todos practicantes esten asignados al proceso

        if (!Page.IsPostBack)
        {
            GestionarPracticas practica;

            if (Request.QueryString["idPractica"] != null)
            {
                practica = new GestionarPracticas();
                DataTable dtPractica = practica.ObtPracticaEspecifica(Convert.ToInt32(Request.QueryString["idPractica"]));
                if (dtPractica.Rows.Count > 0)
                {
                    if (dtPractica.Rows[0]["estadoPractica"].ToString() != "activa")
                        Response.Redirect("../GestionarPracticas/FrConsPracticas.aspx");
                }
                else
                    Response.Redirect("../error.aspx");
                              
                    CargarPracticantesActivos();
                
                CargarAsignados(Convert.ToInt32(Request.QueryString["idPractica"]));
                Habilitar();
            }
            else
            {
                Response.Redirect("../principal.aspx");
            }

                     
        }
    }

    /// <summary>
    /// metodo para obtener todos los practicantes Activos del sistema, se carga la búsqueda 
    /// en el control Listbox (ListBoxPracticantes), se agrega el nombre y apellido como dato a mostrar 
    /// y en el valor el Nombre de Usuaio necesario para asignar un proceso
    /// </summary>

    private void CargarPracticantesActivos()
    {
        DataTable dtPracticantes;
        
        GestionarPracticantes pracActivos = new GestionarPracticantes();
        dtPracticantes = pracActivos.ObtPracticantesPorEstado("habilitado");
        
        ListBoxPracticantes.Items.Clear();
        int cont =0;
        foreach(DataRow dtr in dtPracticantes.Rows)
        {
            ListBoxPracticantes.Items.Add(new ListItem(dtPracticantes.Rows[cont]["nombre"].ToString() + " " + dtPracticantes.Rows[cont]["apellido"].ToString() + " - " + dtPracticantes.Rows[cont]["ProgramaAcademico_nombreProgramaAcademico"].ToString(), dtPracticantes.Rows[cont]["Usuario_nombreUsuario"].ToString()));
            cont++;
        }
    }

    /// <summary>
    /// metodo para obtener todos los practicantes que han sidos asignados a un proceso de selección de una 
    /// práctica especifica dado el identificador de esta.
    /// En el control Listbox (ListBoxAsignados), se agrega el nombre y apellido como dato a mostrar 
    /// y en el valor el Nombre de Usuaio necesario para asignar un proceso
    /// Se Carga la tarea relacionado al proceoso de selección y se muestra en el labelTarea
    /// </summary>
    /// <param name="idPractica">(int) Identificador de la práctica</param>

    private void CargarAsignados(int idPractica)
    {
        int cont = 0;
        ListBoxAsignados.Items.Clear();
        GestionarProcesosSeleccion procesoSeleccion = new GestionarProcesosSeleccion();
        DataTable dtPracticantes = procesoSeleccion.BusquedaAvanazada(idPractica, "Practica");
        Usuario usr = new Usuario();
        if (dtPracticantes.Rows.Count > 0)
        {
            try
            {
                GestionarTareas tarea = new GestionarTareas();
                DataTable dtTarea = tarea.ConsultarTarea(Convert.ToInt32(dtPracticantes.Rows[cont]["Tarea_idTarea"]), "unica");
                LabelTarea.Text = "<br />Tarea relacionada a este procecso de selección <br />" + dtTarea.Rows[cont]["nombre"].ToString();
                LabelIdTarea.Text = dtPracticantes.Rows[cont]["Tarea_idTarea"].ToString();
            }
            catch
            {
                ScriptManager.RegisterStartupScript(this, this.GetType(), "myscript", "$.modaldialog.error('Se encontró un error al tratar de cargar la tarea ', {timeout: 2 , showClose: false });", true);
            }
        }
        else
            LabelTarea.Text = "<br />Seleccione la tarea que corresponda a la Hoja de vida";


        foreach (DataRow dtr in dtPracticantes.Rows)
        {
            usr.BuscarUsuario(dtPracticantes.Rows[cont]["Practicante_Usuario_nombreUsuario"].ToString());
            ListBoxAsignados.Items.Add(new ListItem(usr.ObtNombre() + " " + usr.ObtApellido(), usr.ObtNombreUsuario()));
            cont++;
        }
    }

    /// <summary>
    /// Metodo para asignar uno o mas practicante a un proceso de selección.Se verifica que practicantes
    /// han sido seleccionados en el ListBoxPracticantes recorreindo el control.
    /// Se verifica que no se agreguen practicantes repetidos. se guardan en el labelNotificacion
    /// los nombres de prácticantes que ya hayan sido asignados.
    /// Se verifica si la tarea va a aser asignada por primera vez, y se obtiene del DropDownListTareas
    /// sino del labelIdTarea. Al asignar un practicante se crea una carpeta donde se guardaran los archivos
    /// correspondientes al proceso individual de cada practicante.
    /// Se llama al metodo CargarAsignados la primera vez para evitar que al refrescar la página no se vuelva a
    /// guardar el registro repetido de un practicante.
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
      
    protected void ButtonAsignar_Click(object sender, EventArgs e)
    {
        LabelNotificacion.Text = "<br />Los siguientes practicantes ya han sido asignados ";
        LabelNotificacion.Visible = false;
        int idTarea;
        GestionarProcesosSeleccion proceso = new GestionarProcesosSeleccion();

        CargarAsignados(Convert.ToInt32(Request.QueryString["idPractica"]));

        foreach (ListItem li in ListBoxPracticantes.Items)
        {
            if (li.Selected)
            { 

                if (ListBoxAsignados.Items.FindByValue(li.Value) != null)
                {
                    LabelNotificacion.Visible = true;
                    LabelNotificacion.Text += "<br />" + li.Text;
                }
                else
                {
                    try
                    {
                    if (LabelIdTarea.Text != "")
                        idTarea = Convert.ToInt32(LabelIdTarea.Text);
                    else
                       
                            idTarea = Convert.ToInt32(DropDownListTareas.SelectedItem.Value);
                    
                    
                    proceso.AsignarProceso(Convert.ToInt32(Request.QueryString["idPractica"]), idTarea, li.Value);
                    
                    }
                   catch 
                    {
                        ScriptManager.RegisterStartupScript(this, this.GetType(), "myscript", "$.modaldialog.error('Se encontró un error al tratar de cargar la tarea ', {timeout: 2 , showClose: false });", true);
                    } 

                    DirectoryInfo DIR = new DirectoryInfo(Server.MapPath("../Archivo/ProcesosSeleccion") + "\\" + Request.QueryString["idPractica"] + "\\" + li.Value + "\\");
                    if (!DIR.Exists)
                        DIR.Create();
                    
                }
                
                    
            }
            CargarAsignados(Convert.ToInt32(Request.QueryString["idPractica"]));
            Habilitar();
        }
    }

    /// <summary>
    /// Metodo para modificar la tarea correspondiente a un proceso de selección, cambia el idTarea de todos 
    /// los procesos de selección de la práctica.
    /// Cuando se oprime el botón modificar Tarea por primera vez se se hace visible  el DropDownListTareas y el boton
    /// cancelar. la segunda vez que se oprima el boton guardara el nuevo indentificador de la tarea seleccionada 
    /// y se hacen invisibles los controles DropDownListTareas y el boton de modificar Tarea
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void ButtonModTarea_Click(object sender, EventArgs e)
    {
        try
        {
            if (DropDownListTareas.Visible == true)
            {
                GestionarProcesosSeleccion proceso = new GestionarProcesosSeleccion();
                proceso.ModTareaProcesoSeleccion(Convert.ToInt32(DropDownListTareas.SelectedItem.Value), Convert.ToInt32(Request.QueryString["idPractica"]));
                CargarAsignados(Convert.ToInt32(Request.QueryString["idPractica"]));
                DropDownListTareas.Visible = false;
                ButtonCancelar.Visible = false;
                ScriptManager.RegisterStartupScript(this, this.GetType(), "myscript", "$.modaldialog.success('Tarea modificada', {timeout: 2 , showClose: false });", true);

            }
            else
            {
                DropDownListTareas.Visible = true;
                ButtonCancelar.Visible = true;
            }
        }
        catch
        {
            ScriptManager.RegisterStartupScript(this, this.GetType(), "myscript", "$.modaldialog.error('No se pudo modificar la tarea ', {timeout: 2 , showClose: false });", true);
        }
        

    }
    /// <summary>
    /// Habilita los campos según sea el caso.
    /// caso 1 no hay practicantes asigandos al proceso de selección o se han eliminado todos los que estaban asignados.
    /// Se hace visible el DropDownListTarea para elegir cualquier tarea, se hace invisible el botón modificar tarea
    /// Verifica que la carpeta correspondiente al proceso de selección no exista, si existe la elimina.
    /// Caso 2 Existe al menos un practicante asignado.
    /// hace visible el campo Modificar Tarea y hace invisible el DropDownListTareas.
    /// </summary>
    private void Habilitar()
    {
        
        if (ListBoxAsignados.Items.Count == 0)
        {
            DropDownListTareas.Visible = true;
            ButtonModTarea.Visible = false;
            DirectoryInfo DIR = new DirectoryInfo(Server.MapPath("../Archivo/ProcesosSeleccion") + "\\" + Request.QueryString["idPractica"] + "\\");
            if (DIR.Exists)
                DIR.Delete(true);
        }
        else
        {
            ButtonModTarea.Visible = true;
            DropDownListTareas.Visible = false;
        }
    }

    /// <summary>
    /// Al hacer clic en el botón cancelar correspondiente a modificar tarea, se hace invisible el DropDownListTareas
    /// y el botón cancelar
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void ButtonCancelar_Click(object sender, EventArgs e)
    {
        DropDownListTareas.Visible = false;
            ButtonCancelar.Visible = false;
    }

    /// <summary>
    /// Metodo para desasignar uno o más practicantes del proceso de seleccón actual.
    /// Verifica del control ListBoxAsignados cuales han sido seleccionados y verifica si la carpeta 
    /// del proceso de cada practicante existe, de ser asi elimina todos los archivos que se hayan subido
    /// y el registro de la base de datos.
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
   
    protected void ButtonDesasignar_Click(object sender, EventArgs e)
    {
        GestionarProcesosSeleccion proceso = new GestionarProcesosSeleccion();
        try
        {
            foreach (ListItem li in ListBoxAsignados.Items)
            {
                if (li.Selected)
                {
                    proceso.DesasignarProceso(Convert.ToInt32(Request.QueryString["idPractica"]), li.Value);
                    //DirectoryInfo DIR = new DirectoryInfo(Server.MapPath("../Archivo/ProcesosSeleccion") + "\\" + Request.QueryString["idPractica"] + "\\" + li.Value + "\\");
                    //if (DIR.Exists)
                      //  DIR.Delete(true);
                }
            }
            LabelNotificacion.Text = "";
        
        }
        catch (Exception ex)
        { LabelNotificacion.Text = ex.ToString(); }
        finally
        {
            CargarAsignados(Convert.ToInt32(Request.QueryString["idPractica"]));
            Habilitar();
        }
    }

    /// <summary>
    /// Vuelve a la sección de consultar proceso de selección de la práctica asociada al proceso de selección
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>

    protected void LinkButtonVolver_Click(object sender, EventArgs e)
    {
        Response.Redirect("FrConsProcesosSeleccion.aspx?idPractica=" + Request.QueryString["idPractica"]);
    }
}
